package CapaDatos;

import java.sql.ResultSet;
import java.util.LinkedList;
import CapaSeguridad.*;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Articulo_DAO implements DAO {

    private String sentenciaSQL;
    ConexionDB conexion;
    LinkedList<Articulo_POJO> listaDetalle = new LinkedList<Articulo_POJO>();
    ResultSet resultado;
    int valor=-1;
    private String temp;

    public Articulo_DAO() {
        this.conexion = new ConexionDB();
    }
    
    public LinkedList<Articulo_POJO> obtenerReg(int IdArticulo) throws SQLException {

        temp="SELECT * FROM Articulo WHERE idArticulo = ?";
        PreparedStatement ps=conexion.getConnection().prepareStatement(temp);
        ps.setInt(1, IdArticulo);
        ps.execute();
        
        sentenciaSQL = "SELECT * FROM Articulo WHERE idArticulo = " + IdArticulo;
        System.out.println("Obtener " + sentenciaSQL);
        try {

        	conexion.abrirConexion();
            //resultado = conexion.getResultSet(sentenciaSQL);
            resultado = ps.getResultSet();
            if (resultado.next()) {
                Articulo_POJO articulo = new Articulo_POJO();

                articulo.setDescripcion(resultado.getString("descripcion"));
                articulo.setFechaIngreso(resultado.getString("fechaIngreso"));
                articulo.setIdArticulo(Integer.parseInt(resultado.getString("idArticulo")));
                articulo.setIdCategoria(Integer.parseInt(resultado.getString("idCategoria")));
                articulo.setIdStatus(Integer.parseInt(resultado.getString("idStatus")));
                articulo.setIdUsuario(Integer.parseInt(resultado.getString("idUsuario")));
                articulo.setImagen(resultado.getString("imagen"));
                articulo.setNombre(resultado.getString("nombre"));
                articulo.setPrecio(Double.parseDouble(resultado.getString("precio")));
                articulo.setPuntuacion(Integer.parseInt(resultado.getString("puntuacion")));

                listaDetalle.add(articulo);
                //Prueba
                //System.out.println("Resultado " + resultado.getString("nombre"));
                
                ps.close();
                conexion.cerrarConexion();
            }

        } catch (Exception ex) {
            GuateBayException gerror = new GuateBayException(ex, "Error al obtener registros", CodigoErrorEnum.ErrorDeSQL);
            CapaSeguridad.Error error = new CapaSeguridad.Error(gerror);
            error.insertarError();
            System.out.println("Error " + ex);
            return null;
        }
        return listaDetalle;
    }

    public int guardarReg( String nombre, int puntuacion, String fechaIngreso, String descripcion, Double precio, String imagen, int idCategoria, int idStatus, int idUsuario) throws GuateBayException, SQLException {

        temp="INSERT INTO Articulo ( nombre, puntuacion, fechaIngreso, descripcion, precio, imagen, idCategoria,idStats,  idUsuario  ) VALUES (?,?,?,?,?,?,?,?,?)";
        PreparedStatement ps=conexion.getConnection().prepareStatement(temp);
        ps.setString(1, nombre);
        ps.setInt(2, puntuacion);
        ps.setString(3, fechaIngreso);
        ps.setString(4, descripcion);
        ps.setDouble(5, precio);
        ps.setString(6, imagen);
        ps.setInt(7, idCategoria);
        ps.setInt(8, idStatus);
        ps.setInt(9, idUsuario);
        
        /*sentenciaSQL = "INSERT INTO Articulo ( nombre, puntuacion, fechaIngreso, descripcion, precio, imagen, idCategoria,idStatus,  idUsuario  ) VALUES "
                + "('" + nombre + "', " + puntuacion + ", '" + fechaIngreso + "', '"
                + descripcion + "', " + precio + ", '" + imagen + "', " + idCategoria + ", " + idStatus + ", " + idUsuario + " ) RETURNING idArticulo";
*/
        //System.out.println("Query:  " + sentenciaSQL);
        try {
        	
        	 conexion.abrirConexion();
             //resultado = conexion.getResultSet(sentenciaSQL);
                 valor = ps.executeUpdate();
             //System.out.println ("Insert exitoso");
             //conexion.cerrarConexion();
                 ps.close();
                 conexion.cerrarConexion();
			 //resultado.next();
             //return resultado.getInt("idArticulo");
             return valor;
             
        } catch (Exception ex) {
            GuateBayException gerror = new GuateBayException(ex, "Error al guardar registros", CodigoErrorEnum.ErrorDeSQL);
            CapaSeguridad.Error error = new CapaSeguridad.Error(gerror);
            error.insertarError();
            System.out.println("error " + ex);
            throw new GuateBayException(ex,"Error en transacción",CodigoErrorEnum.ErrorRegistro);            
        }        
    }

    public int actualizarReg(int idArticulo, String nombre, int puntuacion, String fechaIngreso, String descripcion, Double precio, String imagen, int idCategoria, int idStatus, int idUsuario) throws SQLException {

        sentenciaSQL = "UPDATE Articulo SET nombre= '" + nombre + "', puntuacion=" + puntuacion + ", fechaIngreso= '" + fechaIngreso + "', descripcion='"
                + descripcion + "', precio=" + precio + ", imagen= '" + imagen + "',idCategoria='" + idCategoria + "',idStatus= " + idStatus 
                + " WHERE idArticulo=" + idArticulo;
        System.out.println("Update " + sentenciaSQL);

        try {
       	 	conexion.abrirConexion();
            valor = conexion.executeQuery(sentenciaSQL);                
            //System.out.println ("Update exitoso");
            conexion.cerrarConexion();
            return valor;
            
       } catch (Exception ex) {
           System.out.println("error " + ex);
           return -1;
       }
    }

    public int eliminarReg(int idArticulo) {
        sentenciaSQL = "DELETE FROM Articulo WHERE idArticulo = " + idArticulo;
        System.out.println("Delete Query: " + sentenciaSQL);
        try {
       	 	conexion.abrirConexion();
            valor = conexion.executeQuery(sentenciaSQL);
            //System.out.println ("Delete exitoso");
            conexion.cerrarConexion();
            return valor;
            
       } catch (Exception ex) {
            System.out.println("error " + ex);
            return -1;
       }
    }
	
	/**
     * reporta el articulo mas vendido en el ano (year) seleccionado
     */
    public ResultSet repoArticuloMasVendido(String year) {
        sentenciaSQL = "SELECT articulo.nombre, sum(detalle.cantidad) cantidad"
                + " FROM pedido, articulo, detalle "
                + "WHERE detalle.idarticulo = articulo.idarticulo AND pedido.idpedido = detalle.idpedido AND "
                + "pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
                + "GROUP BY articulo.idarticulo having sum(detalle.cantidad)=( "
                + "SELECT max(total) FROM( SELECT sum(detalle.cantidad) total "
                + "FROM pedido, articulo, detalle "
                + "WHERE detalle.idarticulo = articulo.idarticulo AND pedido.idpedido = detalle.idpedido "
                + "AND pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
                + "GROUP BY articulo.idarticulo) tot); ";
        try {
            conexion.abrirConexion();
            resultado = conexion.getResultSet(sentenciaSQL);
            conexion.cerrarConexion();
            return resultado;
        } catch (Exception ex) {
            //Error lanzado
            GuateBayException gerror = new GuateBayException(ex, "Error al reportar", CodigoErrorEnum.ErrorDeSQL);
            CapaSeguridad.Error error = new CapaSeguridad.Error(gerror);
            error.insertarError();
            System.out.println("Error " + ex);
            return null;
        }
    }
	
	
	/**
     * reporta el artículo menos vendido en el año (year) seleccionado
     */
    public ResultSet repoArticuloMenosVendido(String year) {
        sentenciaSQL = "SELECT articulo.nombre, sum(detalle.cantidad) cantidad"
                + " FROM pedido, articulo, detalle "
                + "WHERE detalle.idarticulo = articulo.idarticulo AND pedido.idpedido = detalle.idpedido AND "
                + "pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
                + "GROUP BY articulo.idarticulo having sum(detalle.cantidad)=( "
                + "SELECT min(total) FROM( SELECT sum(detalle.cantidad) total "
                + "FROM pedido, articulo, detalle "
                + "WHERE detalle.idarticulo = articulo.idarticulo AND pedido.idpedido = detalle.idpedido "
                + "AND pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
                + "GROUP BY articulo.idarticulo) tot); ";
        try {
            conexion.abrirConexion();
            resultado = conexion.getResultSet(sentenciaSQL);
            conexion.cerrarConexion();
            return resultado;
        } catch (Exception ex) {
            //Error lanzado
            GuateBayException gerror = new GuateBayException(ex, "Error al reportar", CodigoErrorEnum.ErrorDeSQL);
            CapaSeguridad.Error error = new CapaSeguridad.Error(gerror);
            error.insertarError();
            System.out.println("Error " + ex);
            return null;
        }
    }
	
	
	/**
     * Reporta el articulo mas vendido por categoria, devolviendo las categorias en un arreglo, explicado en el return.
     * 
     * @return El result set que contiene las filas regresadas, cada fila representa una categoria, los campos son (en orden) titulo (de la categoria), nombre (del articulo), compras (cantidad de veces que se compra)
     */
    public ResultSet repoProductosMasCompradosPorCategoria(){
        resultado = null;
        sentenciaSQL = "SELECT c.titulo, a.nombre, compra.compras "
                + "FROM ( "
                    + "SELECT idcategoria,MAX(compras) max "
                    + "FROM articulo a, (SELECT idArticulo, sum(cantidad) compras FROM detalle GROUP BY idArticulo) comp "
                    + "WHERE a.idArticulo = comp.idArticulo GROUP BY idCategoria) maxCompra, "
                    + " (SELECT idArticulo, sum(cantidad) compras FROM detalle GROUP BY idArticulo) compra, "
                    + "Categoria c, articulo a "
                + "WHERE maxCompra.max = compra.compras "
                + "AND compra.idArticulo = a.idArticulo "
                + "AND a.idCategoria = c.idCategoria "
                + "AND c.idCategoria = maxCompra.idCategoria ";
        try {
            conexion.abrirConexion();
            resultado = conexion.getResultSet(sentenciaSQL);
            conexion.cerrarConexion();
            return resultado;
        } catch (Exception ex) {
            //Error lanzado
            GuateBayException gerror = new GuateBayException(ex, "Error al reportar", CodigoErrorEnum.ErrorDeSQL);
            CapaSeguridad.Error error = new CapaSeguridad.Error(gerror);
            error.insertarError();
            System.out.println("Error " + ex);
            return null;
        }
    }
}
